package com.ledong;

import java.lang.reflect.Field;
import java.lang.reflect.Modifier;

import sun.misc.Unsafe;

public class TestClass {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public static void main(String[] args) throws Exception {

        TestClass tc = new TestClass();
        tc.setName("oUCHxP");
        // 现在是一个未知类型的对象(模拟一下)
        Object obj = tc;

        // 获取对象类型,可以看到输出是TestClass类型
        Class c = obj.getClass();
        System.out.println(c);

        // 创建此类型的空对象
        Field fu = Unsafe.class.getDeclaredField("theUnsafe");
        fu.setAccessible(true);
        Unsafe us = (Unsafe) fu.get(null);
        Object newObj = us.allocateInstance(c);

        // 可以看到name是空的
        System.out.println("newObj.name: " + ((TestClass) newObj).getName());

        // 获取所有成员(包括private)的值,并拷贝到新对象中
        Field[] fields = c.getDeclaredFields();
        for (Field f : fields) {
            // 不拷贝static成员和final成员
            if (Modifier.isStatic(f.getModifiers())
                    || Modifier.isFinal(f.getModifiers())) {
                continue;
            }
            f.setAccessible(true);
            Object fieldValue = f.get(obj);
            f.set(newObj, fieldValue);
        }

        // 再看一下新对象里的内容,private成员也被复制过来了
        System.out.println("newObj.name: " + ((TestClass) newObj).getName());
    }
}